// #include<iostream>
// using ll = long long;
// using namespace std;
// const int N = 410, M = 4e4 + 10;
// ll h[N], c[N], a[N];
// ll f[N][M];
// int n;
// int main()
// {
//     // zdl:: 这道题目就是我们经常遇到的那种背包问题，现在就在听了讲解之后来完成这道题目吧！！
//     cin >> n;
//     ll maxh = 0;
//     for (int i = 1; i <= n; i++) 
//     {
//         // 为了获取到后面的结果,我们心啊在还需要找到最高的高度

//         cin >> h[i] >>  a[i] >> c[i];
//         maxh = max(maxh, a[i]);
//     }
//     // zdl::接下来就是多重背包问题了
//     for (int i = 1; i <= n; i++)
//     {
//         for (int j = 0; j <= a[i]; j++)
//         {
//             f[i][j] = f[i - 1][j];
//             for (int k = 1; k <= c[i] && k * h[i] <= j; k++)
//             {
//                 f[i][j] = max(f[i][j], f[i - 1][j - k * h[i]] + k * h[i]);
//             }
//         }
//     }

//     // zdl:: 接下来就是获取结果
//     ll ret = 0;
//     for (int i = 1; i <= n; i++)
//     {
//         for (int j = 1; j <= maxh; j++) 
//             ret = max(ret, f[i][j]);
//     }

//     cout << ret << endl;
//     return 0;
// }


// zdl:： 敲，我还是太年轻了，还是需要使用贪心的思想进行一下排序才行！！

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 410, M = 4e4 + 10;
struct node
{
    int h, a, c;
    
}e[N];
int n;
using ll = long long;
ll f[M];
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> e[i].h >> e[i].a >> e[i].c;
    }
    // 根据贪心的思想我们需要先试用截止高度较小的板砖
    sort(e + 1, e + 1 + n, [](node& x, node& y){
        return x.a < y.a;
    });
    ll ret = 0; 
    for (int i = 1; i <= n; i++)
    {
        auto& [h, a, c] = e[i];
        for (int j = a; j >= 0; j--)
        {
            for (int k = 0; k <= c && k * h <= j; k++)
            {
                f[j] = max(f[j], f[j - k * h] + k * h);
            }
            ret = max(ret, f[j]);
        }
    }

    cout << ret << endl;
    return 0;
}